//package com.example.kiratest.EasyExcel.Service.Impl;
//
//import cn.hutool.core.date.DatePattern;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.fastjson2.JSON;
//import com.example.kiratest.EasyExcel.Service.CommonExcelExportService;
//import com.example.kiratest.EasyExcel.Handler.ExcelExportHandler;
//import com.example.kiratest.EasyExcel.pojo.ExcelImportExportEnum;
//import jakarta.annotation.Resource;
//import jakarta.servlet.http.HttpServletResponse;
//import org.springframework.beans.factory.InitializingBean;
//import org.springframework.stereotype.Service;
//
//import java.io.IOException;
//import java.net.URLEncoder;
//import java.time.LocalDateTime;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 通用Excel导出服务实现类
// * 实现基于模板的Excel导出功能，支持动态处理器注册和多类型数据导出
// */
//@Service
//public class CommonExcelExportServiceImpl implements CommonExcelExportService, InitializingBean {
//
//    // 注入所有实现了ExcelExportHandler接口的Bean
//    @Resource
//    private List<ExcelExportHandler> handlers;
//
//    // 处理器映射表（线程安全），用于快速查找处理器
//    private static final Map<String, ExcelExportHandler> handlerMap = new ConcurrentHashMap<>(16);
//
//    /**
//     * 通用导出方法
//     * @param response Http响应对象
//     * @param importTemplateEnum Excel模板枚举
//     * @param searchCondition 查询条件字符串
//     */
//    @Override
//    public void commonExport(HttpServletResponse response, ExcelImportExportEnum importTemplateEnum, String searchCondition) {
//        // 生成Sheet名称（移除文件后缀）
//        String sheetName = importTemplateEnum.getName().replace(".xlsx", "");
//        // 生成文件名：模板名称_当前日期（纯数字格式）
//        String fileName = sheetName + StrUtil.UNDERLINE + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN);
//
//        try {
//            // 设置响应头
//            response.setContentType("application/vnd.ms-excel");  // 注意：原代码可能有笔误"5/vnd.ms-excel"
//            response.setCharacterEncoding("utf-8");
//            // URL编码文件名，防止中文乱码
//            String excelName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
//            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + excelName + ".xlsx");
//
//            // 执行导出操作
//            doExport(response, importTemplateEnum, searchCondition, sheetName);
//        } catch (Exception e) {
//            // 异常处理：重置响应并返回错误信息
//            response.reset();
//            response.setContentType("application/json");
//            response.setCharacterEncoding("utf-8");
//            Map<String, String> map = new HashMap<>(16);
//            map.put("status", "failure");
//            map.put("message", "下载文件失败" + e.getMessage());
//            try {
//                response.getWriter().println(JSON.toJSONString(map));
//            } catch (IOException ex) {
//                throw new RuntimeException("响应写出失败", ex);
//            }
//        }
//    }
//
//    /**
//     * 执行实际导出操作
//     * @param response Http响应对象
//     * @param excelEnum Excel模板枚举
//     * @param searchCondition 查询条件
//     * @param sheetName 工作表名称
//     * @throws IOException 当发生I/O错误时抛出
//     */
//    private void doExport(HttpServletResponse response, ExcelImportExportEnum excelEnum, String searchCondition, String sheetName) throws IOException, InterruptedException {
//        // 根据Enum来获取对应的处理器
//        ExcelExportHandler handler = handlerMap.get(excelEnum.getCode());
//
//        // 通过处理器获取要导出的数据
//        List<?> exportDataList = handler.getData(searchCondition);
//
//        //通过enum类得到对应处理器实现类，然后根据实现类的getData方法来导出数据
//
//        // 使用EasyExcel执行导出
//        EasyExcel.write(response.getOutputStream(), handler.getExportType())
//                .autoCloseStream(Boolean.FALSE)  // 不自动关闭流（由Spring管理）
//                .sheet(sheetName)
//                .doWrite(exportDataList);
//    }
//
//    /**
//     * Spring Bean初始化方法
//     * 将所有处理器注册到映射表中
//     * @throws Exception 如果发现重复的模板编码
//     */
//    @Override
//    public void afterPropertiesSet() throws Exception {
//        // 遍历所有处理器实现类
//        for (ExcelExportHandler handler : handlers) {
//            String code = handler.getEnum().getCode();
//            // 检查编码是否重复
//            if (handlerMap.containsKey(code)) {
//                throw new IllegalArgumentException("导入导出模板编码不能重复：" + code);
//            }
//            // 注册处理器
//            handlerMap.put(code, handler);
//        }
//    }
//}